// 包路径
const package_NdefRecord = 'android.nfc.NdefRecord';
const package_NdefMessage = 'android.nfc.NdefMessage';
const package_TECH_DISCOVERED = 'android.nfc.action.TECH_DISCOVERED';
const package_Intent = 'android.content.Intent'; 
const package_Activity = 'android.app.Activity'; 
const package_PendingIntent = 'android.app.PendingIntent'; 
const package_IntentFilter = 'android.content.IntentFilter'; 
const package_NfcAdapter = 'android.nfc.NfcAdapter'; 
const package_Ndef = 'android.nfc.tech.Ndef'; 
const package_NdefFormatable = 'android.nfc.tech.NdefFormatable'; 
const package_Parcelable = 'android.os.Parcelable'; 
const package_String = 'java.lang.String'; 

let NfcAdapter;
let NdefRecord;
let NdefMessage;
let readyWrite = false;
let noNFC = false;
let techListsArray = [
	['android.nfc.tech.IsoDep'],
	['android.nfc.tech.NfcA'],
	['android.nfc.tech.NfcB'],
	['android.nfc.tech.NfcF'],
	['android.nfc.tech.Nfcf'],
	['android.nfc.tech.NfcV'],
	['android.nfc.tech.NdefFormatable'],
	['android.nfc.tech.MifareClassi'],
	['android.nfc.tech.MifareUltralight']
];
// 要写入的数据
let text = '{id:123,name:nfc,stie:cssmini.com}';
// let readResult = '';

import { notice } from '@/utils/common.js'

export default {
	data() {
		return {
			readyRead: false,
		}
	},
	methods: {
		listenNFCStatus() {
			try {
				let main = plus.android.runtimeMainActivity();
				let Intent = plus.android.importClass('android.content.Intent');
				let Activity = plus.android.importClass('android.app.Activity');
				let PendingIntent = plus.android.importClass('android.app.PendingIntent');
				let IntentFilter = plus.android.importClass('android.content.IntentFilter');
				NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
				let nfcAdapter = NfcAdapter.getDefaultAdapter(main);
				
				if(nfcAdapter == null){
					notice.toast('设备不支持NFC！')
					noNFC = true;
					return;
				}
				
				if (!nfcAdapter.isEnabled()) {
					notice.toast('请在系统设置中先启用NFC功能！')
					noNFC = true;
					return;
				}else{
					noNFC = false;
				}
				
				let intent = new Intent(main, main.getClass());
				intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
				let pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);
				let ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");
				ndef.addDataType("*/*");
				let intentFiltersArray = [ndef];
				
				let that = this
				plus.globalEvent.addEventListener('newintent',function() {
					that.nfcRuning()
					// 轮询调用 NFC
					// setTimeout(that.nfcRuning(), 5000);
				});
				plus.globalEvent.addEventListener('pause',function(e) {
					if (nfcAdapter) {
						//关闭前台调度系统
						//恢复默认状态
						nfcAdapter.disableForegroundDispatch(main);
					}
				});
				plus.globalEvent.addEventListener('resume',function(e) {
					if (nfcAdapter) {
						 //开启前台调度系统
						// 优于所有其他NFC
						nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
					}
				});
				nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray); 
			} catch (e) {
				console.error(e);
			}
		},
		
		nfcRuning() {
			NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
			NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
			let main = plus.android.runtimeMainActivity();
			let intent = main.getIntent();
			
			if (package_TECH_DISCOVERED == intent.getAction()) {
				if (readyWrite) {
					this.write(intent);
					readyWrite = false;
				} else if (this.readyRead) {
					this.read(intent);
					// this.readyRead = false;
				}
			}
		},
		
		write(intent) {
			try {
				notice.toast('请勿移开标签 正在写入...');
				console.log("text=" + text);
				
				let textBytes = plus.android.invoke(text, "getBytes");
				let textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
												plus.android.invoke("text/plain", "getBytes"),  
												plus.android.invoke("", "getBytes"), textBytes);
				let message = new NdefMessage([textRecord]);
				let Ndef = plus.android.importClass('android.nfc.tech.Ndef');
				let NdefFormatable = plus.android.importClass('android.nfc.tech.NdefFormatable');
				let tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
				let ndef = Ndef.get(tag);
				if (ndef != null) {
					// 待写入的数据长度
					let size = message.toByteArray().length;
					ndef.connect();
					if (!ndef.isWritable()) {
						notice.toast('tag不允许写入！');
						return;
					}
					if (ndef.getMaxSize() < size) {
						notice.toast('文件大小超出容量！');
						return;
					}
					ndef.writeNdefMessage(message);
					notice.toast('写入数据成功！');
					return;
				} else {
					let format = NdefFormatable.get(tag);
					if (format != null) {
						try {
							format.connect();
							format.format(message);
							notice.toast('格式化tag并且写入message');
							return;
						} catch (e) {
							notice.toast('格式化tag失败.');
							return;
						}
					} else {
						notice.toast('Tag不支持NDEF');
						return;
					}
				}
			} catch (e) {
				notice.toast('写入失败');
				console.log("error=" + e);
			}
		},
		
		async read(intent) {
			notice.toast('请勿移开标签正在读取数据', 1000);
			// NFC id
			let bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
			let nfc_id = this.byteArrayToHexString(bytesId);
			console.log('NFC ID:', nfc_id);
			let Parcelable = plus.android.importClass("android.os.Parcelable");
			let rawmsgs = intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSAGES");
			
			if(rawmsgs != null && rawmsgs.length > 0) {
				let records = rawmsgs[0].getRecords();
				let payload = records[0].getPayload();
				let data = plus.android.newObject("java.lang.String", payload);
				console.log('NFC 数据:', data);
				this.nfcData = data
			} else {
				this.nfcData = nfc_id
			}
			
			if(!this.nfcData) {
				notice.toast(this.$t('inspection.taskExecute.nfcRead'))
				return
			}
		},
		
		byteArrayToHexString(inarray) { // converts byte arrays to string  
			let i, j, inn;  
			let hex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];  
			let out = "";  
			
			for(j = 0; j < inarray.length; ++j) {
				inn = inarray[j] & 0xff;  
				i = (inn >>> 4) & 0x0f;  
				out += hex[i];  
				i = inn & 0x0f;  
				out += hex[i];  
			}  
			return out;  
		},
		
		writeData() {
			if(noNFC){
				notice.toast('请检查设备是否支持并开启 NFC 功能！');
				return;
			}
			// 轮询条件
			readyWrite = true;
			notice.toast('请靠近NFC标签！');
		},
		
		readData() {
			if(noNFC){
				notice.toast('请检查设备是否支持并开启 NFC 功能！');
				return;
			}
			// 轮询条件
			// this.readyRead = true;
			notice.toast('请靠近NFC标签！');
		}
	}
}